home *** CD-ROM | disk | FTP | other *** search
- {This very lame source is for all people who wants to code a 3d rotation in
- Pascal.
- There is also a little "morphing" in it. It is no real morph but looks
- like one.(I think so...)
- Sorry for being lazy! But I had no more time to write some comments.
- But I think it's to understand the concept of 3d rotations.
- You can optimize it like hell but never use the whole code and say it's
- your own. Learn from it.
- Ciao!
-
- Ryu D+P+S 12/05/1995 21:41
- }
- uses crt;
- const nump=100;
- sintable : array[1..360] of integer =
- (0,2,4,6,8,11,13,15,17,20,22,24,26,28,30,33,35,37,39,41,43,
- 45,47,50,52,54,56,58,60,62,63,65,67,69,71,73,75,77,78,80,
- 82,83,85,87,88,90,92,93,95,96,98,99,100,102,103,104,106,
- 107,108,109,110,111,113,114,115,116,116,117,118,119,120,
- 121,121,122,123,123,124,124,125,125,126,126,126,127,127,
- 127,127,127,127,127,128,127,127,127,127,127,127,127,126,
- 126,126,125,125,124,124,123,123,122,121,121,120,119,118,
- 117,116,116,115,114,113,111,110,109,108,107,106,104,103,
- 102,100,99,98,96,95,93,92,90,88,87,85,83,82,80,78,77,75,73,
- 71,69,67,65,63,62,60,58,56,54,52,50,47,45,43,41,39,37,35,
- 33,30,28,26,24,22,20,17,15,13,11,8,6,4,2,0,-2,-4,-6,-8,-11,
- -13,-15,-17,-20,-22,-24,-26,-28,-30,-33,-35,-37,-39,-41,
- -43,-45,-47,-50,-52,-54,-56,-58,-60,-62,-64,-65,-67,-69,
- -71,-73,-75,-77,-78,-80,-82,-83,-85,-87,-88,-90,-92,-93,
- -95,-96,-98,-99,-100,-102,-103,-104,-106,-107,-108,-109,
- -110,-111,-113,-114,-115,-116,-116,-117,-118,-119,-120,
- -121,-121,-122,-123,-123,-124,-124,-125,-125,-126,-126,
- -126,-127,-127,-127,-127,-127,-127,-127,-128,-127,-127,
- -127,-127,-127,-127,-127,-126,-126,-126,-125,-125,-124,
- -124,-123,-123,-122,-121,-121,-120,-119,-118,-117,-116,
- -116,-115,-114,-113,-111,-110,-109,-108,-107,-106,-104,
- -103,-102,-100,-99,-98,-96,-95,-93,-92,-90,-88,-87,-85,-83,
- -82,-80,-78,-77,-75,-73,-71,-69,-67,-65,-64,-62,-60,-58,
- -56,-54,-52,-50,-47,-45,-43,-41,-39,-37,-35,-33,-30,-28,
- -26,-24,-22,-20,-17,-15,-13,-11,-8,-6,-4,-2);
-
- costable : array[1..360] of integer =
- (128,127,127,127,127,127,127,127,126,126,126,125,125,124,
- 124,123,123,122,121,121,120,119,118,117,116,116,115,114,
- 113,111,110,109,108,107,106,104,103,102,100,99,98,96,95,93,
- 92,90,88,87,85,83,82,80,78,77,75,73,71,69,67,65,64,62,60,
- 58,56,54,52,50,47,45,43,41,39,37,35,33,30,28,26,24,22,20,
- 17,15,13,11,8,6,4,2,0,-2,-4,-6,-8,-11,-13,-15,-17,-20,-22,
- -24,-26,-28,-30,-33,-35,-37,-39,-41,-43,-45,-47,-50,-52,
- -54,-56,-58,-60,-62,-63,-65,-67,-69,-71,-73,-75,-77,-78,
- -80,-82,-83,-85,-87,-88,-90,-92,-93,-95,-96,-98,-99,-100,
- -102,-103,-104,-106,-107,-108,-109,-110,-111,-113,-114,
- -115,-116,-116,-117,-118,-119,-120,-121,-121,-122,-123,
- -123,-124,-124,-125,-125,-126,-126,-126,-127,-127,-127,
- -127,-127,-127,-127,-128,-127,-127,-127,-127,-127,-127,
- -127,-126,-126,-126,-125,-125,-124,-124,-123,-123,-122,
- -121,-121,-120,-119,-118,-117,-116,-116,-115,-114,-113,
- -111,-110,-109,-108,-107,-106,-104,-103,-102,-100,-99,-98,
- -96,-95,-93,-92,-90,-88,-87,-85,-83,-82,-80,-78,-77,-75,
- -73,-71,-69,-67,-65,-64,-62,-60,-58,-56,-54,-52,-50,-47,
- -45,-43,-41,-39,-37,-35,-33,-30,-28,-26,-24,-22,-20,-17,
- -15,-13,-11,-8,-6,-4,-2,0,2,4,6,8,11,13,15,17,20,22,24,26,
- 28,30,33,35,37,39,41,43,45,47,50,52,54,56,58,60,62,64,65,
- 67,69,71,73,75,77,78,80,82,83,85,87,88,90,92,93,95,96,98,
- 99,100,102,103,104,106,107,108,109,110,111,113,114,115,116,
- 116,117,118,119,120,121,121,122,123,123,124,124,125,125,
- 126,126,126,127,127,127,127,127,127,127);
-
- var xkoord,ykoord,zkoord:array[1..nump]of integer;
- xkoord2,ykoord2,zkoord2:array[1..nump]of integer;
- objx,objy,objz:array[1..nump]of integer;
- lastofs:array[1..nump]of word;
- centerx,centery:word;
- a1,a2,a3:integer;
- i,i2,a:word;
- x,y,z:integer;
- procedure init320x200;assembler;
- asm
- mov ax, 13h
- int 10h
- end;
-
- procedure putpix(x,y:word;color:byte);assembler;
- asm
- push 0a000h
- pop es
- mov cx, y
- mov ax, 320
- mul cx
- mov di, ax
- add di, x
- mov al, color
- stosb
- end;
-
- procedure killpix(ofs:word);assembler;
- asm
- push 0a000h
- pop es
- mov di, ofs
- xor al, al
- stosb
- @bye:
- end;
-
- procedure setcolor(color,r,g,b:byte);assembler;
- asm
- mov dx, 3c8h
- mov al, color
- out dx, al
- inc dx
- mov al, r
- out dx, al
- mov al, g
- out dx, al
- mov al, b
- out dx, al
- end;
-
- procedure retrace;
- begin
- repeat until (port[$3DA] and 8) = 0;
- repeat until (port[$3DA] and 8) > 0;
- end;
-
- procedure disp;
- var x1,y1:word;
- begin
- retrace;
- for i:=1 to nump do begin
- killpix(lastofs[i]);
- x1:=(xkoord2[i] shl 7) div (zkoord2[i]+128)+centerx;
- y1:=(ykoord2[i] shl 7) div (zkoord2[i]+128)+centery;
- IF (x1<320) AND (y1<200) THEN BEGIN
- putpix(x1,y1,15);
- lastofs[i]:=320*y1+x1;
- END ELSE lastofs[i]:=64001;
- end;
- end;
-
- procedure rotate(yangle:word);
- begin
- for i:=1 to nump do begin
- x:=xkoord[i]*costable[yangle]-zkoord[i]*sintable[yangle];
- z:=xkoord[i]*sintable[yangle]+zkoord[i]*costable[yangle];
- xkoord2[i]:=x div 128;
- ykoord2[i]:=ykoord[i];
- zkoord2[i]:=z div 128;
- end;
- end;
-
- procedure calcball;
- var a2:real;
- begin
- a2:=1;
- for i:=1 to nump do begin
- objx[i]:=sintable[round(a2)]*50 div 128;
- objy[i]:=costable[round(a2)]*50 div 128;
- objz[i]:=0;
- a2:=a2+3.6;
- end;
- end;
-
- procedure calccube;
- begin
- a1:=-30;
- a2:=-30;
- a3:=-30;
- for i:=1 to nump do begin
- objx[i]:=a1;
- objy[i]:=a2;
- objz[i]:=a3;
- inc(a1,10);
- if a1=20 then begin
- a1:=-30;
- inc(a2,10);
- end;
-
- if a2=20 then begin
- a2:=-30;
- inc(a3,10);
- end;
- end;
- end;
-
- procedure calcsquare;
- begin
- for i:=1 to 25 do begin
- objx[i]:=-55+(i*5);
- objy[i]:=-50;
- objz[i]:=0;
- end;
- for i:=25 to 50 do begin
- objx[i]:=-60+((i-24)*5);
- objy[i]:=75;
- objz[i]:=0;
- end;
- for i:=50 to 75 do begin
- objx[i]:=-55;
- objy[i]:=-50+((i-50)*5);
- objz[i]:=0;
- end;
- for i:=75 to 100 do begin
- objx[i]:=65;
- objy[i]:=-50+((i-75)*5);
- objz[i]:=0;
- end;
- end;
-
- procedure calcrandom;
- begin
- randomize;
- for i:=1 to nump do begin
- objx[i]:=random(150)-75;
- objy[i]:=random(100)-50;
- objz[i]:=random(100)-50;
- end;
- end;
-
- procedure calccyl;
- var a2:real;
- begin
- a1:=-50;
- a2:=0;
- for i:=1 to nump do begin
- objx[i]:=sintable[round(a2)]*20 div 128;
- objy[i]:=costable[round(a2)]*20 div 128;
- objz[i]:=a1;
- IF (i mod 10)=0 then begin
- a2:=0;
- inc(a1,10);
- end;
- a2:=a2+360/10;
- end;
-
- end;
-
- procedure easymorph;
- begin
- for i:=1 to nump do begin
- IF xkoord[i]<objx[i] THEN inc(xkoord[i]);
- IF ykoord[i]<objy[i] THEN inc(ykoord[i]);
- IF zkoord[i]<objz[i] THEN inc(zkoord[i]);
- IF xkoord[i]>objx[i] THEN dec(xkoord[i]);
- IF ykoord[i]>objy[i] THEN dec(ykoord[i]);
- IF zkoord[i]>objz[i] THEN dec(zkoord[i]);
- end;
- end;
-
- begin
- init320x200;
- randomize;
- for i:=1 to nump do begin
- xkoord[i]:=random(150)-75;
- ykoord[i]:=random(100)-50;
- zkoord[i]:=random(100)-50;
- end;
- centerx:=160;
- centery:=100;
- i2:=1;
- repeat
- IF i2=1 then calcrandom;
- IF i2=250 then calccube;
- IF i2=500 then calcball;
- IF i2=750 then calcsquare;
- IF i2=1000 then calccyl;
- easymorph;
- inc(i2);
- IF i2=1250 then i2:=1;
- rotate(a);
- disp;
- IF a<359 THEN inc(a,2) else a:=1;
- until keypressed;
- textmode(co80);
- writeln('Coding by Ryu/D+P+S');
- writeln('There is no music!');
- writeln('But, what can you expect? It was coded during the Spots! (WerbePause?)');
- writeln('Greetz fly to: Madness/D+P+S, Seppel, MiLKMAN, rouge, ToPBaNaNa');
- delay(900);
- end.